//package com.kami.file;
//
//import java.io.*;
//import java.nio.charset.StandardCharsets;
//import java.nio.file.Files;
//import java.util.*;
//
///**
// * @Description TODO
// * @Author zhenhuiguo
// * @Date 2023/1/1 20:41
// **/
//
//public class Txt {
//    static final String lineSeparator = ",";
//
//    public static void main(String[] args) throws IOException {
//        long startTime = System.currentTimeMillis();
//        String txtFilePath = "src\\cc.txt";
//        List<List<String>> newContents = new ArrayList<>();
//        for (int i = 0; i < 100; i++) {
//            List<String> contents = Arrays.asList("kami"+i,"1");
//            newContents.add(contents);
//        }
//        for (int i = 0; i < 100; i++) {
//            List<String> contents = Arrays.asList("andy"+i,"0","2");
//            newContents.add(contents);
//        }
////        for (int i = 0; i < 50; i++) {
////            List<String> contents = Arrays.asList("kami"+i,"0","2");
////            newContents.add(contents);
////        }
//
////        writeTxt(path, results, false);
//        writeTxtByUpdateAndAppendData(txtFilePath,newContents);
//        System.out.printf("main 运行耗时 %d%n", (System.currentTimeMillis() - startTime));
//    }
//
//    public static void writeTxt(String path, List<List<String>> result, boolean append) throws IOException {
//        long startTime = System.currentTimeMillis();
//        //创建文件,传入path路径中的内容
//        File file = new File(path);
//        boolean existed = true;
//        if (!file.exists()) {
//            existed = false;// 首次写入文件
//            file.createNewFile();//创建文件
//        }
//
////        OutputStreamWriter outStream = null;//创建输出流，byte数据（0-1），
//        BufferedWriter bufferedWriter = null;//缓冲流，提高写入的性能， 一次IO速度慢， cpu 速度高于io（从磁盘读取），先把数据写入缓冲区，再批量写入磁盘。
//
//        //写
//        try {
////            outStream = new OutputStreamWriter(Files.newOutputStream(file.toPath()),UTF_8);//目前用不到了
//            //把数据流包装成buffer流?
//            // 用FileWriter 包装缓冲流， FileWriter类 extends OutputStreamWriter类
//            bufferedWriter = new BufferedWriter(new FileWriter(file, append));
//            System.out.println("write to file " + file.getAbsolutePath());
//            // 追加的表头，第一行，不用写，如何判断是否追加 还是首次写入， 我读取不到上一行的数， 首次写入， 如果我能识别上一行数据，
//            int i = 0;
//            if (existed) {
//                i = 1;
//            }
//            for (; i < result.size(); i++) {
//                for (int j = 0; j < result.get(i).size(); j++) {
//                    // 每一行的列值，都列举出来,如果是最后一列，不加逗号
//                    if (j < result.get(i).size() - 1) {
//                        bufferedWriter.write(result.get(i).get(j) + ",");
//                    } else {
//                        bufferedWriter.write(result.get(i).get(j));
//                    }
//
//                }
//                bufferedWriter.newLine();//换行i，txt里面需要换行操作
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {//关闭2个输出流量资源，先打开的后关闭
//            bufferedWriter.close();
////            outStream.close();
//        }
//
//        System.out.printf("writeTxt 运行耗时 %d%n", (System.currentTimeMillis() - startTime) );
//    }
//
//    public static void writeTxtByUpdateAndAppendData(String txtFilePath, List<List<String>> newContents) throws IOException {
//        long startTime = System.currentTimeMillis();
//        // 读取已有的TXT文件数据
//        List<String> txtContents = readTxtOnceByAll(txtFilePath);
//        // 获取名字和行号的映射，并累加txt数据中的天数(如果超过两列)
//        Map<String, Integer> nameLineNumberMap = splitLinesStringData(txtContents);
//        // 累加加班天数
//        updateTxtContents(nameLineNumberMap,txtContents,newContents);
//        // 覆盖写
//        writeDataToTxtFile(txtFilePath, txtContents, false);
//
//        System.out.printf("writeTxtByUpdateAndAppendData 运行耗时 %d%n", (System.currentTimeMillis() - startTime) );
//    }
//
//    public static void writeDataToTxtFile(String txtFilePath, List<String> data, boolean append) throws IOException {
//        long startTime = System.currentTimeMillis();
//        //创建文件,传入path路径中的内容
//        File file = new File(txtFilePath);
//        if (!file.exists()) {
//            file.createNewFile();//创建文件
//        }
//
//        BufferedWriter bufferedWriter = null;//缓冲流，提高写入的性能， 一次IO速度慢， cpu 速度高于io（从磁盘读取），先把数据写入缓冲区，再批量写入磁盘。
//        try {
//            bufferedWriter = new BufferedWriter(new FileWriter(file, append));
//            System.out.println("write to file " + file.getAbsolutePath());
//            for (int i = 0; i < data.size(); i++) {
//                bufferedWriter.write(data.get(i));
//                bufferedWriter.newLine();//换行i，txt里面需要换行操作
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {//关闭2个输出流量资源，先打开的后关闭
//            bufferedWriter.close();
//        }
//
//        System.out.printf("writeTxt 运行耗时 %d%n", (System.currentTimeMillis() - startTime) );
//    }
//
//    // 一次性读取txt的文件内容，占用内存多
//    public static List<String> readTxtOnceByAll(String txtFilePath) throws IOException {
//        long startTime = System.currentTimeMillis();
//        File file = new File(txtFilePath);
//        if (!file.exists()) {
//            file.createNewFile();
//            return new ArrayList<>();
//        }
//        byte[] data = new byte[(int) file.length()];
//        try {
//            FileInputStream in = new FileInputStream(file);
//            in.read(data);
//            in.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        List<String> res = Arrays.asList(new String(data).split("\r\n"));
//        System.out.printf("readTxtOnceByAll 运行耗时 %d%n", (System.currentTimeMillis() - startTime) );
//        return res;
//    }
//
//    // 一行一行读取TXT文件内容，占用内存少
//    public static List<String> readTxtOnceByLine(String txtFilePath) {
//        long startTime = System.currentTimeMillis();
//        File file = new File(txtFilePath);
//        if (!file.isFile() || !file.exists()) {
//            throw new RuntimeException(String.format("readTxtOnceByLine txtFilePath not exist %s", txtFilePath));
//        }
//        List<String> res = new LinkedList<>();
//        try {
//            InputStreamReader read = new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8);
//            BufferedReader bufferedReader = new BufferedReader(read);
//            String lineTxt = null;
//            while ((lineTxt = bufferedReader.readLine()) != null) {
//                res.add(lineTxt);
//            }
//            bufferedReader.close();
//            read.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        System.out.printf("readTxtOnceByLine 运行耗时 %d%n", (System.currentTimeMillis() - startTime) );
//        return res;
//    }
//
//    /**
//     * 分割数据，只读取分割后的前两列值
//     *
//     * @param contents 格式：name,0,1,1
//     * @return key：第一列值，value：行号(0开始)
//     */
//    public static Map<String, Integer> splitLinesStringData(List<String> contents) {
//        long startTime = System.currentTimeMillis();
//        // key：姓名 value：行号
//        Map<String, Integer> res = new HashMap<>();
//        for (int i = 0; i < contents.size(); i++) {
//            String[] split = contents.get(i).split(lineSeparator);
//            if (res.containsKey(split[0])) {
//                // 发现原始文本有重复的姓名
//                throw new RuntimeException(String.format("find duplicate name: %s, line:%d", split[0], i));
//            }
//            if (split.length > 2) {
//                // 累加加班天数
//                int cnt = Integer.parseInt(split[1]);
//                for (int j = 2; j < split.length; j++) {
//                    cnt += Integer.parseInt(split[j]);
//                }
//                // 替换为累加的天数
//                contents.set(i, String.format("%s%s%d", split[0], lineSeparator, cnt));
//            }
//            res.put(split[0], i);
//        }
//        System.out.printf("splitLinesData 运行耗时 %d%n", (System.currentTimeMillis() - startTime) );
//        return res;
//    }
//
//    public static void updateTxtContents(Map<String, Integer> namesLineNoMap, List<String> txtExistedContents, List<List<String>> newContents) {
//        long startTime = System.currentTimeMillis();
//        for (int i = 0; i < newContents.size(); i++) {
//            String name = newContents.get(i).get(0);
//            Integer lineNo = namesLineNoMap.get(name);
//            int dayCnt = sumHolidays(newContents.get(i));
//            if (Objects.isNull(lineNo)) {
//                txtExistedContents.add(String.format("%s%s%d", name, lineSeparator, dayCnt));
//            } else {
//                if (dayCnt > 0) {
//                    String lineData = txtExistedContents.get(lineNo);
//                    String[] splitLineData = lineData.split(lineSeparator);
//                    dayCnt += Integer.parseInt(splitLineData[1]);
//                    txtExistedContents.set(lineNo,String.format("%s%s%d", name, lineSeparator, dayCnt));
//                }
//            }
//        }
//        System.out.printf("updateTxtContents 运行耗时 %d%n", (System.currentTimeMillis() - startTime) );
//    }
//
//    public static int sumHolidays(List<String> nameDays) {
//        if (nameDays.size() < 2) {
//            throw new RuntimeException(String.format("sumHolidays nameDays size is less than 2，size:%d", nameDays.size()));
//        }
//        if (nameDays.size() == 2) {
//            return Integer.parseInt(nameDays.get(1));
//        }
//        int cnt = Integer.parseInt(nameDays.get(1));
//        for (int i = 2; i < nameDays.size(); i++) {
//            cnt += Integer.parseInt(nameDays.get(i));
//        }
//        return cnt;
//    }
//}
